package com.example.mybatis_plus_use.Exception;

import com.example.mybatis_plus_use.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * 全局异常处理类
 * 使用 @ControllerAdvice 注解，表示该类用于处理全局的异常。
 */
@Slf4j
@RestControllerAdvice//这是@ControllerAdvice和@ResponseBody的结合体
public class GlobalExceptionHandler {
    /**
     * 处理自定义异常
     *
     * @param ex 自定义异常对象
     * @return 返回一个包含错误信息和 HTTP 状态码的 Result 对象
     * 自定义异常需要在全局异常处理器中注册，以便能够统一处理这些异常并返回友好的错误信息。
     */
    @ExceptionHandler(CustomException.class) // 捕获 CustomException 类型的异常
    public Result<String> handleCustomException(CustomException ex) {
        // 返回成功的 Result 对象，包含自定义异常的消息和 OK 状态
        return Result.error(("客户端请求错误:" + ex.getMessage() + HttpStatus.BAD_REQUEST));//客户端请求错误
    }

    /**
     * 处理所有其他异常
     *
     * @param ex 捕获的异常对象
     * @return 返回一个包含错误信息和 HTTP 状态码的 Result 对象
     */
    @ExceptionHandler(Exception.class) // 捕获所有其他类型的异常
    public Result<String> handleException(Exception e) {
        // 添加日志记录
        log.error("系统异常:", e);
        return Result.error("服务器内部错误: " + e.getMessage()+ HttpStatus.INTERNAL_SERVER_ERROR);//服务器内部错误
    }

}
//@ResponseBody 注解的作用是：
//告诉 Spring MVC 这个方法返回的对象应该直接写入到 HTTP 响应体中
//将返回的对象自动转换为 JSON 格式
//确保异常处理方法的返回值能够正确地序列化为 HTTP 响应
//没有 @ResponseBody 注解时会发生什么：
//Spring MVC 会尝试找一个视图（view）来渲染结果
//由于找不到对应的视图，异常处理就无法正确返回错误信息
//这就是为什么你只在日志中看到警告，但前端没有收到正确的错误响应